テクニカル Q&A

ME 08 - Temporary メモリ(1999年8月24日)


Q: 一般的にメモリ負担の少ないバックグラウンドアプリケーションを作成していますが、稀に多くのメモリを単発的に使用することがあります。Temporary メモリを使いたいのですが、Inside Macintosh: Memory では WaitNextEvent をまたがって temporary メモリをロックしたままにしてはいけないと書いてあります。代わりにシステムヒープを使うべきでしょうか?

A: いいえ。システムヒープを使うぐらいだったら、まだ temporary メモリをロックして使う方がましです。その理由を説明します。

Inside Macintosh: Memory(pp. 2-10)では次のような記述がありますが、

[...] you must never lock temporary memory across calls to GetNextEvent or WaitNextEvent [...]

本来は次ように記述されるべきです。

[...] you should avoid locking temporary memory across calls to GetNextEvent or WaitNextEvent [...]

Temporary メモリのハンドルをロックしたまま他プロセスに処理時間を委ねると、Process Manager ヒープはフラグメント化の恐れが出てきます。Process Manager ヒープがフラグメント化すると、十分な空きメモリがあるのに、ユーザはアプリケーションを起動させることができない場合があります。フラグメント化の原因となっているアプリケーションがはっきりしていればまだいいものの、ユーザは原因が見えないだけに挫折感を感じるでしょう。

しかし、本当に“一時的”にメモリを使うだけだったら、メモリを割り当てて、ハンドルをロックして、そして後にロックの解除またはメモリを捨てることはある程度容認できます。少なくとも、以下のような代案に比較するとまだ安全だと言えます。

  • アプリケーションのメモリの使用サイズを大きくすることは簡単ですが、普段使用しないのに多くのメモリを要することユーザに迷惑です。
  • システムヒープ内でメモリを割り当てることは可能ですが、システムヒープのメモリはトラッキングされていないため、アプリケーションが予期しない理由で終了されたしまった場合、システムヒープ内に割り当てたメモリはメモリリークとして残ります。また、システムヒープメモリは常に物理的メモリに保管されますので、仮想メモリの働きを効率悪くします。
  • 特定の処理を専用のバックグラウンドアプリケーションに委ねて、このアプリケーションを必要な時だけ起動することも考えられますが、Process Manager ヒープのフラグメント化については Temporary メモリをロックすることと同じです。

Temporary メモリハンドルをロックする場合は必ず事前に MoveHHi をして下さい。これにより、Process Manager ヒープのフラグメント化の可能性を低く押さえることができます。


-- Quinn "The Eskimo!"
Worldwide Developer Technical Support

テクニカル Q&A | 目次

To contact us, please use the Contact Us page.